﻿using log4net;
using System;
using System.Diagnostics;
using System.Reflection;
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
namespace YanZhiwei.DotNet.Log4net1._2._13.Utilities
{
    /// <summary>
    /// Log4net 帮助类
    /// </summary>
    public class Log4NetHelper
    {
        /*
      [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
      */
        /*
        AdoNetAppender：利用ADO.NET记录到数据库的日志。
        AnsiColorTerminalAppender：在ANSI 窗口终端写下高亮度的日志事件。
        AspNetTraceAppender：能用asp.net中Trace的方式查看记录的日志。
        BufferingForwardingAppender：在输出到子Appenders之前先缓存日志事件。
        ConsoleAppender：将日志输出到控制台。
        EventLogAppender：将日志写到Windows Event Log. 
        FileAppender：将日志写到文件中。
        LocalSyslogAppender：将日志写到local syslog service (仅用于UNIX环境下). 
        MemoryAppender：将日志存到内存缓冲区。
        NetSendAppender：将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
        RemoteSyslogAppender：通过UDP网络协议将日志写到Remote syslog service。
        RemotingAppender：通过.NET Remoting将日志写到远程接收端。
        RollingFileAppender：将日志以回滚文件的形式写到文件中。
        SmtpAppender：将日志写到邮件中。
        TraceAppender：将日志写到.NET trace 系统。
        UdpAppender：将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。
         */

        /*
        %m(message):输出的日志消息，如ILog.Debug(…)输出的一条消息 
        %n(new line):换行 
        %d(datetime):输出当前语句运行的时刻 
        %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数 
        %t(thread id):当前语句所在的线程ID 
        %p(priority): 日志的当前优先级别，即DEBUG、INFO、WARN…等 
        %c(class):当前日志对象的名称，例如：
        %f(file):输出语句所在的文件名。
        %l(line)：输出语句所在的行号。
        %数字：表示该项的最小长度，如果不够，则用空格填充，如“%-5level”表示level的最小宽度是5个字符，如果实际长度不够5个字符则以空格填充。
         */

        /*
         在config文件中可以很方便地关闭和启用日志，就是在<root>进行配置
         如果想增加日志输出目的地，增加<appender-ref>节点就是了，注意后面的ref是在config中配置的appender name，如果想要取消，删除或者注释掉这行就可以了。
Log4Net的使用.
         */

        /*
         日志的等级，它们由高到底分别为：
        OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL 
        高于等级设定值方法（如何设置参见“配置文件详解”）都能写入日志， Off所有的写入方法都不写到日志里，ALL则相反。例如当我们设成Info时，logger.Debug就会被忽略而不写入文件，但是FATAL,ERROR,WARN,INFO会被写入，因为他们等级高于INFO。
        在具体写日志时，一般可以这样理解日志等级：
        FATAL（致命错误）：记录系统中出现的能使用系统完全失去功能，服务停止，系统崩溃等使系统无法继续运行下去的错误。例如，数据库无法连接，系统出现死循环。
        ERROR（一般错误）：记录系统中出现的导致系统不稳定，部分功能出现混乱或部分功能失效一类的错误。例如，数据字段为空，数据操作不可完成，操作出现异常等。
        WARN（警告）：记录系统中不影响系统继续运行，但不符合系统运行正常条件，有可能引起系统错误的信息。例如，记录内容为空，数据内容不正确等。
        INFO（一般信息）：记录系统运行中应该让用户知道的基本信息。例如，服务开始运行，功能已经开户等。
        DEBUG （调试信息）：记录系统用于调试的一切信息，内容或者是一些关键数据内容的输出。
         */
        private static readonly ILog log = LogManager.GetLogger(typeof(Log4NetHelper));
        /// <summary>
        /// Debug记录 【调用方法名称+日志信息】
        /// </summary>
        /// <param name="message">日志信息</param>
        public static void DebugPlus(string message)
        {
            if (log.IsDebugEnabled)
            {
                MethodBase _methodBase = new StackTrace().GetFrame(1).GetMethod();
                log.Debug(_methodBase.Name + " : " + message);
            }
        }
        /// <summary>
        /// Debug记录 【调用方法名称+异常信息】
        /// </summary>
        /// <param name="message">信息</param>
        /// <param name="ex">Exception</param>
        public static void DebugPlus(string message, Exception ex)
        {
            if (log.IsDebugEnabled)
            {
                MethodBase _methodBase = new StackTrace().GetFrame(1).GetMethod();
                log.Debug(_methodBase.Name + " : " + message, ex);
            }
        }
        /// <summary>
        /// Debug记录
        /// </summary>
        /// <param name="message">信息</param>
        public static void Debug(string message)
        {
            if (log.IsDebugEnabled)
            {
                log.Debug(message);
            }
        }
        /// <summary>
        /// Debug记录
        /// </summary>
        /// <param name="message">信息</param>
        /// <param name="ex">Exception</param>
        public static void Debug(string message, Exception ex)
        {
            if (log.IsDebugEnabled)
            {
                log.Debug(message, ex);
            }
        }
        //--------------------------------------------
        /// <summary>
        /// Error记录
        /// </summary>
        /// <param name="message">信息</param>
        public static void Error(string message)
        {
            if (log.IsErrorEnabled)
            {
                log.Error(message);
            }
        }
        /// <summary>
        /// Error记录
        /// </summary>
        /// <param name="message">信息</param>
        /// <param name="ex">Exception</param>
        public static void Error(string message, Exception ex)
        {
            if (log.IsErrorEnabled)
            {
                log.Error(message, ex);
            }
        }
        /// <summary>
        /// Error记录 【调用方法名称+日志信息】
        /// </summary>
        /// <param name="message">日志信息</param>
        public static void ErrorPlus(string message)
        {
            if (log.IsErrorEnabled)
            {
                MethodBase _methodBase = new StackTrace().GetFrame(1).GetMethod();
                log.Error(_methodBase.Name + " : " + message);
            }
        }
        /// <summary>
        /// Error记录【调用方法名称+异常信息】
        /// </summary>
        /// <param name="message">信息</param>
        /// <param name="ex">Exception</param>
        public static void ErrorPlus(string message, Exception ex)
        {
            if (log.IsErrorEnabled)
            {
                MethodBase _methodBase = new StackTrace().GetFrame(1).GetMethod();
                log.Error(_methodBase.Name + " : " + message, ex);
            }
        }
        //--------------------------------------

        /// <summary>
        /// Fatal记录
        /// </summary>
        /// <param name="message">信息</param>
        public static void Fatal(string message)
        {
            if (log.IsFatalEnabled)
            {
                log.Fatal(message);
            }
        }
        /// <summary>
        /// Fatal记录【调用方法名称+异常信息】
        /// </summary>
        /// <param name="message">信息</param>
        /// <param name="ex">Exception</param>
        public static void Fatal(string message, Exception ex)
        {
            if (log.IsFatalEnabled)
            {
                log.Fatal(message, ex);
            }
        }

        /// <summary>
        /// Fatal记录 【调用方法名称+日志信息】
        /// </summary>
        /// <param name="message">日志信息</param>
        public static void FatalPlus(string message)
        {
            if (log.IsFatalEnabled)
            {
                MethodBase _methodBase = new StackTrace().GetFrame(1).GetMethod();
                log.Fatal(_methodBase.Name + " : " + message);
            }
        }
        /// <summary>
        /// Error记录 【调用方法名称+日志信息】
        /// </summary>
        /// <param name="message">日志信息</param>
        /// <param name="ex">Exception</param>
        public static void FatalPlus(string message, Exception ex)
        {
            if (log.IsFatalEnabled)
            {
                MethodBase _methodBase = new StackTrace().GetFrame(1).GetMethod();
                log.Fatal(_methodBase.Name + " : " + message, ex);
            }
        }
        //-------------------------------------------------------

        /// <summary>
        /// Info记录
        /// </summary>
        /// <param name="message">信息</param>
        public static void Info(string message)
        {
            if (log.IsInfoEnabled)
            {
                log.Info(message);
            }
        }
        /// <summary>
        /// Info记录【调用方法名称+异常信息】
        /// </summary>
        /// <param name="message">信息</param>
        /// <param name="ex">Exception</param>
        public static void Info(string message, Exception ex)
        {
            if (log.IsInfoEnabled)
            {
                log.Info(message, ex);
            }
        }
        /// <summary>
        /// Info记录 【调用方法名称+日志信息】
        /// </summary>
        /// <param name="message">日志信息</param>
        public static void InfoPlus(string message)
        {
            if (log.IsInfoEnabled)
            {
                MethodBase _methodBase = new StackTrace().GetFrame(1).GetMethod();
                log.Info(_methodBase.Name + " : " + message);
            }
        }

        /// <summary>
        /// Info记录【调用方法名称+异常信息】
        /// </summary>
        /// <param name="message">信息</param>
        /// <param name="ex">Exception</param>
        public static void InfoPlus(string message, Exception ex)
        {
            if (log.IsInfoEnabled)
            {
                MethodBase _methodBase = new StackTrace().GetFrame(1).GetMethod();
                log.Info(_methodBase.Name + " : " + message, ex);
            }
        }
        //----------------------------------------------------------
        /// <summary>
        ///Warn记录
        /// </summary>
        /// <param name="message">信息</param>
        public static void Warn(string message)
        {
            //if (log.IsWarnEnabled)
            //{
            log.Warn(message);
            //}
        }
        /// <summary>
        /// Warn记录【信息+异常信息】
        /// </summary>
        /// <param name="message">信息</param>
        /// <param name="ex">Exception</param>
        public static void Warn(string message, Exception ex)
        {
            //if (log.IsWarnEnabled)
            //{
            log.Warn(message, ex);
            //}
        }
        /// <summary>
        /// Warn记录 【调用方法名称+日志信息】
        /// </summary>
        /// <param name="message">日志信息</param>
        public static void WarnPlus(string message)
        {
            if (log.IsWarnEnabled)
            {
                MethodBase _methodBase = new StackTrace().GetFrame(1).GetMethod();
                log.Warn(_methodBase.Name + " : " + message);
            }
        }

        /// <summary>
        /// Warn记录【调用方法名称+异常信息】
        /// </summary>
        /// <param name="message">信息</param>
        /// <param name="ex">Exception</param>
        public static void WarnPlus(string message, Exception ex)
        {
            if (log.IsWarnEnabled)
            {
                MethodBase _methodBase = new StackTrace().GetFrame(1).GetMethod();
                log.Warn(_methodBase.Name + " : " + message, ex);
            }
        }

    }
}
